from core.tools.tool.api_tool import ApiTool
from core.tools.tool.tool import Tool
from tests.integration_tests.tools.__mock.http import setup_http_mock

tool_bundle = {
    'server_url': 'http://www.example.com/{path_param}',
    'method': 'post',
    'author': '',
    'openapi': {'parameters': [{'in': 'path', 'name': 'path_param'},
                               {'in': 'query', 'name': 'query_param'},
                               {'in': 'cookie', 'name': 'cookie_param'},
                               {'in': 'header', 'name': 'header_param'},
                               ],
                'requestBody': {
                    'content': {'application/json': {'schema': {'properties': {'body_param': {'type': 'string'}}}}}}
                },
    'parameters': []
}
parameters = {
    'path_param': 'p_param',
    'query_param': 'q_param',
    'cookie_param': 'c_param',
    'header_param': 'h_param',
    'body_param': 'b_param',
}


def test_api_tool(setup_http_mock):
    tool = ApiTool(api_bundle=tool_bundle, runtime=Tool.Runtime(credentials={'auth_type': 'none'}))
    headers = tool.assembling_request(parameters)
    response = tool.do_http_request(tool.api_bundle.server_url, tool.api_bundle.method, headers, parameters)

    assert response.status_code == 200
    assert '/p_param' == response.request.url.path
    assert b'query_param=q_param' == response.request.url.query
    assert 'h_param' == response.request.headers.get('header_param')
    assert 'application/json' == response.request.headers.get('content-type')
    assert 'cookie_param=c_param' == response.request.headers.get('cookie')
    assert 'b_param' in response.content.decode()
